//package com.rxyb.security.config;
//
//import cn.hutool.json.JSONUtil;
//import com.rxyb.core.respone.R;
//import com.rxyb.security.exception.BusiOAuth2Exception;
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Bean;
//import org.springframework.security.access.AccessDecisionManager;
//import org.springframework.security.access.AccessDecisionVoter;
//import org.springframework.security.access.vote.AuthenticatedVoter;
//import org.springframework.security.access.vote.RoleVoter;
//import org.springframework.security.access.vote.UnanimousBased;
//import org.springframework.security.config.annotation.ObjectPostProcessor;
//import org.springframework.security.config.annotation.web.builders.HttpSecurity;
//import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
//import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
//import org.springframework.security.core.userdetails.UserDetailsService;
//import org.springframework.security.web.access.expression.WebExpressionVoter;
//import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
//
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * @author YJH
// * @version 1.0
// * @description
// * @date 2020/6/5  18:01
// */
//@EnableWebSecurity
//public class SecurityFilterConfig extends WebSecurityConfigurerAdapter  {
//
//
//    @Override
//    protected void configure(HttpSecurity http) throws Exception {
//        //        http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/login").failureUrl("/login-error").permitAll();
//        // 退出登录 缓存失效
//        http.logout().invalidateHttpSession(true).permitAll();
//        http.cors().disable();
//
//        //
//        //        /* 开启跨域共享，  跨域伪造请求限制=无效 */
//        //        http.cors().and().csrf().disable();
//        //
//        /* 开启授权认证 */
//        http.authorizeRequests()
//                /* 动态url权限 */.withObjectPostProcessor(new DefinedObjectPostProcessor())
//                /* url决策 */.accessDecisionManager(accessDecisionManager()).anyRequest().authenticated();
//        //
//        //        /* 登录配置 */
//        //        http.formLogin().usernameParameter("username").passwordParameter("password").loginProcessingUrl("/login");
//        //
//        //        /* 登录失败后的处理 */
//        //        http.formLogin().failureHandler(new LoginFailureHandler());
//        //
//        //        /* 登录过期/未登录 处理 */
//        //        http.exceptionHandling().authenticationEntryPoint(new LoginExpireHandler());
//        //
//        //        /* 权限不足(没有赋予角色) 处理 */
//        //        http.exceptionHandling().accessDeniedHandler(new AuthLimitHandler());
//        //
//        //        /* 登录成功后的处理 */
//        //        http.formLogin().successHandler(new LoginSuccessHandler());
//        //
//        //        /* 退出成功处理器 */
//        //        http.logout().logoutUrl("/logout").permitAll().invalidateHttpSession(true).logoutSuccessHandler(new LogoutHandler());
//
//    }
//
//    class DefinedObjectPostProcessor implements ObjectPostProcessor<FilterSecurityInterceptor> {
//        @Override
//        public <O extends FilterSecurityInterceptor> O postProcess(O object) {
//            object.setSecurityMetadataSource(urlRolesFilterHandler);
//            return object;
//        }
//    }
//
//    /**
//     * AffirmativeBased – 任何一个AccessDecisionVoter返回同意则允许访问
//     * ConsensusBased – 同意投票多于拒绝投票（忽略弃权回答）则允许访问
//     * UnanimousBased – 每个投票者选择弃权或同意则允许访问
//     * <p>
//     * 决策管理
//     */
//    private AccessDecisionManager accessDecisionManager() {
//        List<AccessDecisionVoter<? extends Object>> decisionVoters = new ArrayList<>();
//        decisionVoters.add(new WebExpressionVoter());
//        decisionVoters.add(new AuthenticatedVoter());
//        decisionVoters.add(new RoleVoter());
//        /* 路由权限管理 */
//        decisionVoters.add(new UrlRoleAuthHandler());
//        return new UnanimousBased(decisionVoters);
//    }
//}
